home *** CD-ROM | disk | FTP | other *** search
/ EnigmA Amiga Run 1996 February / EnigmA AMIGA RUN 04 (1996)(G.R. Edizioni)(IT)[!][issue 1996-02][Skylink CD III].iso / earcd / assembler / progasm1.lha / SORGENTI3 / LEZIONE7x3.s < prev    next >
Text File  |  1994-11-28  |  9KB  |  315 lines

  1.  
  2. ; lezione7x3.s    - Collsioni tra playfield in Dual Playfield mode
  3. ; In questo esempio mostriamo le collisioni tra i due playfield.
  4. ; Il playfield 1 si muove dall'alto in basso.
  5. ; Se il colore 3 del playfield 1 si sovrappone al colore 1 del playfield 2
  6. ; viene rilevata una collisione e viene cambiato il colore di sfondo
  7.  
  8.     SECTION    CiriCop,CODE
  9.  
  10. Inizio:
  11.     move.l    4.w,a6        ; Execbase
  12.     jsr    -$78(a6)    ; Disable
  13.     lea    GfxName(PC),a1    ; Nome lib
  14.     jsr    -$198(a6)    ; OpenLibrary
  15.     move.l    d0,GfxBase
  16.     move.l    d0,a6
  17.     move.l    $26(a6),OldCop    ; salviamo la vecchia COP
  18.  
  19. ; Usiamo 2 planes per ogni playfield
  20.  
  21. ;    Puntiamo le PIC
  22.  
  23.     MOVE.L    #PIC1,d0    ; puntiamo il playfield 1
  24.     LEA    BPLPOINTERS1,A1
  25.     MOVEQ    #2-1,D1
  26. POINTBP:
  27.     move.w    d0,6(a1)
  28.     swap    d0
  29.     move.w    d0,2(a1)
  30.     swap    d0
  31.     ADD.L    #40*256,d0
  32.     addq.w    #8,a1
  33.     dbra    d1,POINTBP
  34.  
  35.     MOVE.L    #PIC2,d0    ; puntiamo il playfield 2
  36.     LEA    BPLPOINTERS2,A1
  37.     MOVEQ    #2-1,D1
  38. POINTBP2:
  39.     move.w    d0,6(a1)
  40.     swap    d0
  41.     move.w    d0,2(a1)
  42.     swap    d0
  43.     ADD.L    #40*256,d0
  44.     addq.w    #8,a1
  45.     dbra    d1,POINTBP2
  46.  
  47.     move.l    #COPPERLIST,$dff080    ; nostra COP
  48.     move.w    d0,$dff088        ; START COP
  49.     move.w    #0,$dff1fc        ; NO AGA!
  50.     move.w    #$c00,$dff106        ; NO AGA!
  51.  
  52.     move.w    #$0024,$dff104    ; BPLCON2
  53.                 ; con questo valore gli sprite sono tutti
  54.                 ; sopra entrambi i playfield
  55.  
  56. aspetta1:
  57.     cmpi.b    #$ff,$dff006    ; Linea 255?
  58.     bne.s    aspetta1
  59. aspetta11:
  60.     cmpi.b    #$ff,$dff006    ; Ancora Linea 255?
  61.     beq.s    aspetta11
  62.  
  63.     btst    #6,$bfe001
  64.     beq.s    esci
  65.  
  66.     bsr.s    MuoviCopper    ; Muove il playfield 1
  67.     bsr.w    CheckColl    ; Controlla collisione e provvede
  68.  
  69.     bra.s    aspetta1
  70.  
  71. esci    move.l    OldCop(PC),$dff080    ; Puntiamo la cop di sistema
  72.     move.w    d0,$dff088        ; facciamo partire la vecchia cop
  73.  
  74.     move.l    4.w,a6
  75.     jsr    -$7e(a6)    ; Enable
  76.     move.l    gfxbase(PC),a1
  77.     jsr    -$19e(a6)    ; Closelibrary
  78.     rts
  79.  
  80. ;    Dati
  81.  
  82. GfxName:
  83.     dc.b    "graphics.library",0,0
  84.  
  85. GfxBase:
  86.     dc.l    0
  87.  
  88. OldCop:
  89.     dc.l    0
  90.  
  91.  
  92. ; Questa routine muove un playfield in basso. E` la stessa della lezione 5
  93. ; solo che spostiamo solo il playfield 1, cioe` solo i bitplanes dispari. 
  94.  
  95. MuoviCopper:
  96.     LEA    BPLPOINTERS1,A1    ; Con queste 4 istruzioni preleviamo dalla
  97.     move.w    2(a1),d0    ; copperlist l'indirizzo dove sta puntando
  98.     swap    d0        ; attualmente il $dff0e0 e lo poniamo
  99.     move.w    6(a1),d0    ; in d0 - il contrario della routine che
  100.                 ; punta i bitplanes! Qua invece di mettere
  101.                 ; l'indirizzo lo prendiamo!!!
  102.  
  103.     TST.B    SuGiu        ; Dobbiamo salire o scendere? se SuGiu e'
  104.                 ; azzerata, (cioe' il TST verifica il BEQ)
  105.                 ; allora saltiamo a VAIGIU, se invece e' a $FF
  106.                 ; (se cioe' questo TST non e' verificato)
  107.                 ; continuiamo salendo (facendo dei sub)
  108.     beq.w    VAIGIU
  109.     cmp.l    #PIC1-(40*90),d0    ; siamo arrivati abbastanza in ALTO?
  110.     beq.s    MettiGiu    ; se si, siamo in cima e dobbiamo scendere
  111.     sub.l    #40,d0        ; sottraiamo 40, ossia 1 linea, facendo
  112.                 ; scorrere in BASSO la figura
  113.     bra.s    Finito
  114.  
  115. MettiGiu:
  116.     clr.b    SuGiu        ; Azzerando SuGiu, al TST.B SuGiu il BEQ
  117.     bra.s    Finito        ; fara' saltare alla routine VAIGIU
  118.  
  119. VAIGIU:
  120.     cmpi.l    #PIC1+(40*30),d0    ; siamo arrivati abbastanza in BASSO?
  121.     beq.s    MettiSu        ; se si, siamo in fondo e dobbiamo risalire
  122.     add.l    #40,d0        ; Aggiungiamo 40, ossia 1 linea, facendo
  123.                 ; scorrere in ALTO la figura
  124.     bra.s    finito
  125.  
  126. MettiSu:
  127.     move.b    #$ff,SuGiu    ; Quando la label SuGiu non e' a zero,
  128.     rts            ; significa che dobbiamo risalire.
  129.  
  130. Finito:                ; PUNTIAMO I PUNTATORI BITPLANES
  131.     LEA    BPLPOINTERS1,A1    ; puntatori nella COPPERLIST
  132.     MOVEQ    #1,D1        ; numero di bitplanes -1 (qua sono 2)
  133. POINTBP3:
  134.     move.w    d0,6(a1)    ; copia la word BASSA dell'indirizzo del plane
  135.     swap    d0        ; scambia le 2 word di d0 (es: 1234 > 3412)
  136.     move.w    d0,2(a1)    ; copia la word ALTA dell'indirizzo del plane
  137.     swap    d0        ; scambia le 2 word di d0 (es: 3412 > 1234)
  138.     ADD.L    #40*256,d0    ; + lunghezza bitplane -> prossimo bitplane
  139.     addq.w    #8,a1        ; andiamo ai prossimi bplpointers nella COP
  140.     dbra    d1,POINTBP3    ; Rifai D1 volte POINTBP (D1=num of bitplanes)
  141.     rts
  142.  
  143.  
  144. ;    Questo byte, indicato dalla label SuGiu, e' un FLAG.
  145.  
  146. SuGiu:
  147.     dc.b    0,0
  148.  
  149.  
  150. ; Questa routine controlla se c'e` collisione.
  151. ; In caso affermativo, cambia il colore dello sfondo
  152. ; modificando nella copper list il valore assunto dal registro COLOR00.
  153.  
  154. CheckColl:
  155.     move.w    $dff00e,d0    ; legge CLXDAT ($dff00e)
  156.                 ; una lettura di questo registro ne provoca
  157.                 ; anche la cancellazione, per cui conviene
  158.                 ; copiarselo in d0 e fare i test su d0
  159.     btst.l    #0,d0        ; il bit 0 indica la collisione tra playfield
  160.     beq.s    no_coll        ; se non c'e` collisione salta
  161.  
  162.     move.w    #$f00,rileva_collisione ; "accende" il rivelatore (color0)
  163.                     ; modificando la copperlist (rosso)
  164.     bra.s    ExitColl
  165.     
  166. no_coll:
  167.     move.w    #$000,rileva_collisione ; "spegne" il rivelatore (color0)
  168.                     ; modificando la copperlist (nero)
  169. ExitColl:
  170.     rts
  171.  
  172. flag:
  173.     dc.w    0
  174. altezza:
  175.     dc.w    $2c
  176.  
  177.  
  178.  
  179.     SECTION    GRAPHIC,DATA_C
  180.  
  181. COPPERLIST:
  182. SpritePointers:
  183.     dc.w    $120,0,$122,0,$124,0,$126,0,$128,0 ; SPRITE
  184.     dc.w    $12a,0,$12c,0,$12e,0,$130,0,$132,0
  185.     dc.w    $134,0,$136,0,$138,0,$13a,0,$13c,0
  186.     dc.w    $13e,0
  187.  
  188.     dc.w    $8E,$2c81    ; DiwStrt
  189.     dc.w    $90,$2cc1    ; DiwStop
  190.     dc.w    $92,$38        ; DdfStart
  191.     dc.w    $94,$d0        ; DdfStop
  192.     dc.w    $102,0        ; BplCon1
  193.     dc.w    $108,0        ; Bpl1Mod
  194.     dc.w    $10a,0        ; Bpl2Mod
  195.  
  196.             ; 5432109876543210
  197.     dc.w    $100,%0100011000000000    ; bit 10 acceso = dual playfield
  198.                     ; uso 4 planes = 4 colori per playfield
  199.  
  200. BPLPOINTERS1:
  201.     dc.w $e0,0,$e2,0    ;primo bitplane playfield 1 (BPLPT1)
  202.     dc.w $e8,0,$ea,0    ;secondo bitplane playfield 1 (BPLPT3)
  203.  
  204.  
  205. BPLPOINTERS2:
  206.     dc.w $e4,0,$e6,0    ;primo bitplane playfield 2 (BPLPT2)
  207.     dc.w $ec,0,$ee,0    ;secondo bitplane playfield 2 (BPLPT4)
  208.  
  209. ; Questo e` il registro CLXCON (controlla il modo di rilevamento)
  210.  
  211. ; i bit da 0 a 5 sono i valori che devono essere assunti dai plane
  212. ; i bit da 6 a 11 indicano quali planes sono abilitati alle collisioni
  213. ; i bit da 12 a 15 indicano quali degli sprite dispari sono abilitati
  214. ; al rilevamento delle collisioni.
  215.  
  216.             ;5432109876543210
  217.     dc.w    $98,%0000001111000111    ; CLXCON
  218.  
  219. ; I planes 1,2,3,4 sono attivi per le collisioni (bit 6,7,8,9).
  220. ; viene segnalata collisione tra i playfield quando si sovrappongono
  221. ; un pixel che ha:    plane 1 = 1 (bit 0)
  222. ;               plane 3 = 1 (bit 2)
  223. ; cioe` con il colore 3 del playfield 1
  224. ; e un pixel che ha:    plane 2 = 1 (bit 1)
  225. ;               plane 4 = 0 (bit 3)
  226. ; cioe` con il colore 1 del playfield 2
  227.  
  228.  
  229.     dc.w    $180    ; COLOR00
  230. rileva_collisione:
  231.     dc.w    0    ; IN QUESTO PUNTO la routine CheckColl modifica
  232.             ; la copper list scrivendo il colore giusto.
  233.  
  234.                             ; palette playfield 1
  235.     dc.w    $182,$005    ; colori da 0 a 7
  236.     dc.w    $184,$a40
  237.     dc.w    $186,$f80
  238.     dc.w    $188,$f00
  239.     dc.w    $18a,$0f0
  240.     dc.w    $18c,$00f
  241.     dc.w    $18e,$080
  242.  
  243.  
  244.                 ; palette playfield 2
  245.     dc.w    $192,$367    ; colori da 9 a 15
  246.     dc.w    $194,$0cc     ; il colore 8 e` trasparente, non va settato
  247.     dc.w    $196,$a0a 
  248.     dc.w    $198,$242
  249.     dc.w    $19a,$282
  250.     dc.w    $19c,$861
  251.     dc.w    $19e,$ff0
  252.  
  253.     dc.w    $FFFF,$FFFE    ; Fine della copperlist
  254.  
  255.     dcb.b    40*90,0    ; questo spazio azzerato serve perche' spostandoci
  256.             ; a visualizzare piu' in basso e piu' in alto usciamo
  257.             ; dalla zona della PIC1 e visualizziamo quello che sta
  258.             ; prima e dopo la pic stessa, il che' causerebbe
  259.             ; la visualizzazione di byte sparsi di disturbo.
  260.             ; mettendo dei byte azzerati in quel punto viene
  261.             ; visualizzato $0000, ossia il colore di sfondo.
  262.  
  263. PIC1:    incbin    "colldual1.raw"
  264.     dcb.b    40*30,0    ; vedi sopra
  265.  
  266. PIC2:    incbin    "colldual2.raw"
  267.  
  268.     end
  269.  
  270. In questo esempio mostriamo la collisione tra due playfield. Il meccanismo e`
  271. lo stesso delle collisioni tra gli sprite. Il registro CLXCON viene usato per
  272. indicare quali planes sono attivi per il rilevamento delle collisioni. Come
  273. al solito e` possibile indicare quali planes sono attivi, e quali valori
  274. devono assumere affinche` la collisione sia rilevata.
  275. Nell'esempio rileviamo le collisioni tra colore 3 del playfield 1 e colore 1 
  276. del playfield 2. Se modificate la copperlist cambiando il valore di CLXCON,
  277. potete rivelare altri tipi di collisione. Ad esempio provate cosi`:
  278.  
  279.     dc.w    $98,%0000001111000110    ; CLXCON
  280.  
  281.  I planes 1,2,3,4 sono attivi per le collisioni (bit 6,7,8,9).
  282.  Viene segnalata collisione tra i playfield quando si sovrappongono
  283.  un pixel che ha:    plane 1 = 0 (bit 0)
  284.                        plane 3 = 1 (bit 2)
  285.  cioe` il colore 2 del playfield 1
  286.  e un pixel che ha:    plane 2 = 1 (bit 1)
  287.                        plane 4 = 0 (bit 3)
  288.  cioe` il colore 1 del playfield 2
  289.  
  290. Potete rilevare collisioni tra piu` colori non abilitando alcuni planes.
  291. Esempio:
  292.  
  293.     dc.w    $98,%0000001011000011    ; CLXCON
  294.  
  295.  I planes 1,2 e 4 sono attivi per le collisioni (bit 6,7 e 9).
  296.  Per quant riguarda il playfield 2 sono attivi entrambi i planes pertanto
  297.  verranno considerati i pixel che hanno:    plane 2 = 1 (bit 1)
  298.                                                plane 4 = 0 (bit 3)
  299. cioe` il colore 1 del playfield 2
  300.  
  301. Per quanto riguarda il playfield 1 invece e` abilitato solo il plane 1
  302. e il valore del plane 3 non ha importanza.
  303. Verranno considerati sia i pixel che hanno:    plane 0 = 1 (bit 0)
  304.                                                plane 3 = 0 (bit 2)
  305.  sia i pixel che hanno:                     plane 0 = 1 (bit 0)
  306.                                                plane 3 = 1 (bit 2)
  307.  
  308. Cioe` vengono considerati sia il colore 1 del playfield 1, che il colore 3
  309. del playfield 1.
  310.  
  311. Per il rilevamento vero e proprio si usa come al solito un bit di CLXDAT.
  312. In questo caso si tratta del bit 0. Se vale 1 c'e` collisione tra i colori 
  313. specificati con CLXCON, altrimenti no.
  314.  
  315.